package ongd.negocio.gestion;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Clase que corresponde a la entidad Fraccionado de la base
 * de datos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@Entity
@Table(name = "fraccionado")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Fraccionado.findAll", query = "SELECT f FROM Fraccionado f"),
    @NamedQuery(name = "Fraccionado.findByIdFraccionado", query = "SELECT f FROM Fraccionado f WHERE f.fraccionadoPK.idFraccionado = :idFraccionado"),
    @NamedQuery(name = "Fraccionado.findByMes", query = "SELECT f FROM Fraccionado f WHERE f.mes = :mes"),
    @NamedQuery(name = "Fraccionado.findByPersonaDNI", query = "SELECT f FROM Fraccionado f WHERE f.fraccionadoPK.personaDNI = :personaDNI")})
public class Fraccionado extends Entidad implements Serializable {
    
    /**
     * Identificador de la cuota.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Atributo que corresponde con la clave del fraccionado.
     */
    @EmbeddedId
    protected FraccionadoPK fraccionadoPK;
    /**
     * Atributo que corresponde con el mes del fraccioando.
     */
    @Basic(optional = false)
    @Column(name = "Mes")
    private String mes;
    @JoinColumn(name = "persona_DNI", referencedColumnName = "DNI", insertable = false, updatable = false)
    /**
     * Atributo que corresponde con la persona a la que pertenece el fraccionado.
     */
    @ManyToOne(optional = false)
    private Persona persona;

    /**
     * Constructor de la clase.
     */
    public Fraccionado() {
    }
    
    /**
     * Constructor de la clase.
     * @param id identificador del fraccionado.
     * @param p persona a la que pertenece. 
     */
     public Fraccionado(int id, Persona p) {
        this.fraccionadoPK = new FraccionadoPK(id, p.getDni());
        persona = p;
    }

     /**
      * Constructosr de la clase.
      * @param fraccionadoPK clave primaria del fraccionado. 
      */
    public Fraccionado(FraccionadoPK fraccionadoPK) {
        this.fraccionadoPK = fraccionadoPK;
    }

    /**
     * Constructor de la clase.
     * @param fraccionadoPK clave primaria del fraccionado.
     * @param mes mes del fraccionado. 
     */
    public Fraccionado(FraccionadoPK fraccionadoPK, String mes) {
        this.fraccionadoPK = fraccionadoPK;
        this.mes = mes;
    }

    /**
     * Constructor de la clase.
     * @param idFraccionado identificador del fraccionado.
     * @param personaDNI persona a la que pertenece el fraccionado. 
     */
    public Fraccionado(int idFraccionado, String personaDNI) {
        this.fraccionadoPK = new FraccionadoPK(idFraccionado, personaDNI);
    }

    /**
     * Método que devuelve la clave del fraccionado.
     * @return fraccionadoPK
     * @see #setFraccionadoPK
     */
    public FraccionadoPK getFraccionadoPK() {
        return fraccionadoPK;
    }

    /**
     * Método que asigna un nuevo valor a la clave del fraccionado.
     * @param fraccionadoPK nueva clave.
     *  @see #getFraccionadoPK
     */
    public void setFraccionadoPK(FraccionadoPK fraccionadoPK) {
        this.fraccionadoPK = fraccionadoPK;
    }

    /**
     * Método que devuelve el mes del fraccionado.
     * @return mes.
     * @see #setMes
     */
    public String getMes() {
        return mes;
    }

    /**
     * Método que asigna un nuevo mes al fraccionado.
     * @param mes nuevo mes. 
     * @see #getMes
     */
    public void setMes(String mes) {
        this.mes = mes;
    }

    /**
     * Método que devuelve la persona a la que pertenece el fraccionado.
     * @return persona.
     * @see #setPersona
     */
    public Persona getPersona() {
        return persona;
    }

    /**
     * Método que asigna una nueva persona a la que pertenece el fraccionado.
     * @param persona nueva persona. 
     * @see #getPersona
     */
    public void setPersona(Persona persona) {
        if(!persona.esVoluntario()){
            this.persona = persona;
        }
    }

    /**
     * Método que devuelve un número con una propiedad fundamental, si dos 
     * objetos son iguales el valor retornado por sus respectivos hashCode 
     * debe ser igual.
     * @return hash
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (fraccionadoPK != null ? fraccionadoPK.hashCode() : 0);
        return hash;
    }

     /**
     * Método que compara si dos fraccionados son iguales.
     * @param object Objeto a comparar
     * @return true o false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Fraccionado)) {
            return false;
        }
        Fraccionado other = (Fraccionado) object;
        if ((this.fraccionadoPK == null && other.fraccionadoPK != null) || (this.fraccionadoPK != null && !this.fraccionadoPK.equals(other.fraccionadoPK))) {
            return false;
        }
        return true;
    }

    /**
     * Método que devuelve una cadena con el fraccionado.
     * @return string
     */
    @Override
    public String toString() {
        return "ongd.negocio.entidades.Fraccionado[ fraccionadoPK=" + fraccionadoPK + " ]";
    }
    
    /**
     * Método que devuelve el mes en número.
     * @return número de mes
     */
    public int obtenerMes() {
        if (mes.compareTo("ENERO") == 0 || mes.compareTo("Enero") == 0) {
            return 0;
        } else if (mes.compareTo("FEBRERO") == 0 || mes.compareTo("Febrero") == 0) {
            return 1;
        } else if (mes.compareTo("MARZO") == 0 || mes.compareTo("Marzo") == 0) {
            return 2;
        } else if (mes.compareTo("ABRIL") == 0 || mes.compareTo("Abril") == 0) {
            return 3;
        } else if (mes.compareTo("MAYO") == 0 || mes.compareTo("Mayo") == 0) {
            return 4;
        } else if (mes.compareTo("JUNIO") == 0 || mes.compareTo("Junio") == 0) {
            return 5;
        } else if (mes.compareTo("JULIO") == 0 || mes.compareTo("Julio") == 0) {
            return 6;
        } else if (mes.compareTo("AGOSTO") == 0 || mes.compareTo("Agosto") == 0) {
            return 7;
        } else if (mes.compareTo("SEPTIEMBRE") == 0 || mes.compareTo("Septiembre") == 0) {
            return 8;
        } else if (mes.compareTo("OCTUBRE") == 0 || mes.compareTo("Octubre") == 0) {
            return 9;
        } else if (mes.compareTo("NOVIEMBRE") == 0 || mes.compareTo("Noviembre") == 0) {
            return 10;
        } else {
            return 11;
        }
    }    
}
